package com.ywk.json.utils;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * GR
 * 一个关于JSON的简单转换工具类；<br>
 * 如果有更加复杂的转换，可以通过getGson()获取gson对象，然后再自行转换，方法为：gson.fromJson(json, new TypeToken<T>() {}.getType())
 * @author binzec
 */
public class JsonUtil {

	private static Gson gson = new Gson();
	
	/**
	 * 获取gson对象，可以自己做一些比较复杂的转换
	 */
	public static Gson getGson() {
		return gson;
	}
	
	/**
	 * 把一个对象（包括javaBean、Map、List等）转成json字符串
	 */
	public static String toJson(Object obj) {
		return gson.toJson(obj);
	}
	
	/**
	 * 将json字符串转成javaBean
	 * @param json	json字符串
	 * @param clazz	bean类型
	 */
	public static <T> T jsonToBean(String json, Class<T> clazz) {
		if (!StringUtils.isEmpty(json)) {
			return gson.fromJson(json, clazz);
		} else {
			return null;
		}
	}
	
	/**
	 * 将json字符串转成List
	 * @param json	json字符串
	 * @param clazz	List中的泛型
	 */
	public static <T> List<T> jsonToList(String json, Class<T> clazz) {
		List<T> list = new ArrayList<T>();
		if (!StringUtils.isEmpty(json)) {
			JsonArray array = new JsonParser().parse(json).getAsJsonArray();
			for (JsonElement elem : array) {
				list.add(gson.fromJson(elem, clazz));
			}
		}
		return list;
	}
	
	/**
	 * 将json字符串转成Map<String, ?>
	 * @param json	json字符串
	 * @param clazz	Map中value的泛型
	 */
	public static <T> Map<String, T> jsonToMap(String json, Class<T> clazz) {
		Map<String, T> map = null;
		if (!StringUtils.isEmpty(json)) {
			map = gson.fromJson(json, new TypeToken<Map<String, T>>() {}.getType());
		}
		return map;
	}
	
}
